# -*- coding: utf-8 -*-
"""
Flask应用工厂模式初始化文件
功能：创建和配置Flask应用实例
作者：东篱馆主
创建时间：2024-12-19
修改时间：2024-12-19
"""

from flask import Flask
from flask_cors import CORS
from config.config import Config
from config.database import init_databases, close_databases, database_health_check
from api import api_bp
import logging
import os
import atexit
from dotenv import load_dotenv


def create_app(config_class=Config):
    """
    Flask应用工厂函数
    
    Args:
        config_class: 配置类，默认为Config
        
    Returns:
        Flask: 配置好的Flask应用实例
    """
    # 加载环境变量（必须在应用创建前）
    env_path = os.path.join(os.path.dirname(__file__), '..', '.env')
    load_dotenv(env_path)
    
    # 创建Flask应用实例，配置静态文件目录
    # 从app/__init__.py文件位置计算到backend/static的路径
    static_folder = os.path.join(os.path.dirname(__file__), '..', 'static')
    app = Flask(__name__, static_folder=static_folder, static_url_path='/static')
    
    # 加载配置
    app.config.from_object(config_class)
    
    # 配置CORS跨域
    CORS(app, resources={
        r"/api/*": {
            "origins": [
                "http://localhost:3000", "http://127.0.0.1:3000",
                "http://localhost:5173", "http://127.0.0.1:5173",
                "http://localhost:8080", "http://127.0.0.1:8080"
            ],
            "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
            "allow_headers": ["Content-Type", "Authorization"]
        }
    })
    
    # 配置日志
    _configure_logging(app)
    
    # 注册蓝图
    _register_blueprints(app)
    
    # 初始化数据库连接
    with app.app_context():
        init_databases(app)
    
    # 注册错误处理器
    _register_error_handlers(app)
    
    # 添加健康检查路由
    _register_health_routes(app)
    
    # 注册应用关闭时的清理函数
    atexit.register(close_databases)
    
    app.logger.info("MetasoCreator Flask应用创建完成")
    return app


def _configure_logging(app):
    """
    配置应用日志
    
    Args:
        app: Flask应用实例
    """
    # 创建logs目录
    logs_dir = os.path.join(os.path.dirname(app.root_path), 'logs')
    if not os.path.exists(logs_dir):
        os.makedirs(logs_dir)
    
    # 配置控制台日志处理器（用于调试模式）
    if app.debug:
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(logging.Formatter(
            '%(asctime)s [%(name)s] %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
        ))
        console_handler.setLevel(logging.DEBUG)
        app.logger.addHandler(console_handler)
        app.logger.setLevel(logging.DEBUG)
        
        # 设置其他模块的日志级别
        logging.getLogger('api.search').setLevel(logging.DEBUG)
        logging.getLogger('api.content').setLevel(logging.DEBUG)
        logging.getLogger('api.qa').setLevel(logging.DEBUG)
        logging.getLogger('services.search_service').setLevel(logging.DEBUG)
        logging.getLogger('services.content_service').setLevel(logging.DEBUG)
        logging.getLogger('metaso_client').setLevel(logging.DEBUG)
    
    # 配置文件日志处理器（生产模式）
    if not app.testing:
        file_handler = logging.FileHandler(
            os.path.join(logs_dir, 'MetasoCreator.log'),
            encoding='utf-8'
        )
        file_handler.setFormatter(logging.Formatter(
            '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
        ))
        file_handler.setLevel(logging.INFO)
        app.logger.addHandler(file_handler)
        
        if not app.debug:
            app.logger.setLevel(logging.INFO)
    
    app.logger.info('MetasoCreator应用启动')


def _register_blueprints(app):
    """
    注册蓝图
    
    Args:
        app: Flask应用实例
    """
    # 注册API蓝图
    app.register_blueprint(api_bp, url_prefix='/api')


def _register_error_handlers(app):
    """
    注册错误处理器
    
    Args:
        app: Flask应用实例
    """
    @app.errorhandler(404)
    def not_found_error(error):
        return {'error': '资源未找到', 'code': 404}, 404
    
    @app.errorhandler(500)
    def internal_error(error):
        return {'error': '服务器内部错误', 'code': 500}, 500
    
    @app.errorhandler(400)
    def bad_request_error(error):
        return {'error': '请求参数错误', 'code': 400}, 400


def _register_health_routes(app):
    """
    注册健康检查路由
    
    Args:
        app: Flask应用实例
    """
    @app.route('/health')
    def health_check():
        """应用健康检查"""
        return {
            'status': 'healthy',
            'service': 'MetasoCreator Backend',
            'version': '1.0.0'
        }
    
    @app.route('/health/database')
    def health_database():
        """数据库健康检查"""
        return database_health_check()